package base.thread_demo.demo08_03;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 终止模式之两阶段终止模式：在一个线程t1中如何优雅的终止线程t2，优雅是说给t2一个料理后事的机会。
 * 模拟监控工具记录应用日志。
 * 提供手动关闭工具记录日志功能。
 */
public class InterruptMonitorTool2 {

    public static void main(String[] args) throws InterruptedException {
        MonitorTools tools = new InterruptMonitorTool2().new MonitorTools();

        // 启动日志监控
        tools.start();

        // 模拟日常监控中
        Thread.sleep(5000);


        // 模拟手动关闭日志监控
        tools.stop();
    }


    class MonitorTools {
        private final Logger log = LoggerFactory.getLogger(MonitorTools.class);

        private Thread monitor;

        // 启动监控线程
        public void start() {
            // 启动一个线程来完成功能
            monitor = new Thread(()->{
                Thread current = Thread.currentThread();
                while (true){
                    if (current.isInterrupted()){// 接收到打断信息
                        log.info("功能: 结束收尾工作...");
                        break;
                    }

                    try {
                        Thread.sleep(2000);// 监控每隔2s监控一次日志
                        log.info("功能：调用执行监控记录日志功能....");
                    } catch (InterruptedException e) {
                        current.interrupt();// 打断标识重置为true,进入上面if判断,结束任务
                    }
                }
            });

            monitor.start();
        }

        // 停止监控线程
        public void stop() {
            // 向 monitor 发送一个打断请求
            monitor.interrupt();
        }

    }
}
